/**
 * Description:
 * Class Name:CachedRowSetTest
 * Date:2022/4/10 14:19
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第13章_MySQL数据库和JDBC编程._13_6_使用RowSet1_1来包装结果集._13_6_2_离线RowSet;

import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetProvider;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class CachedRowSetTest {
    private String driver;
    private String url;
    private String user;
    private String pwd;

    public void initParam(String paramFilePath) throws Exception{
        Properties props = new Properties();
        props.load(new FileReader(paramFilePath));
        driver = props.getProperty("driver");
        url = props.getProperty("url");
        user = props.getProperty("user");
        pwd = props.getProperty("pwd");
    }

    public CachedRowSet doQuery(String sql) throws Exception{
        try(
                // 获取数据库连接，并获得一般的需要数据库保持连接的结果集
                Connection connection = DriverManager.getConnection(url, user, pwd);
                Statement statement = connection.createStatement();
                ResultSet resultSet = statement.executeQuery(sql);
                ){
            // 创建CachedRowSet结果集，将前面的ResultSet装填到该RowSet
            CachedRowSet cachedRowSet = RowSetProvider.newFactory().createCachedRowSet();
            cachedRowSet.populate(resultSet);

            // 这时候关闭各种数据库连接资源，不会影响RowSet
            resultSet.close();
            statement.close();
            connection.close();

            return cachedRowSet;
        }
    }

    public static void main(String[] args)  throws Exception{
        var crst = new CachedRowSetTest();
        crst.initParam("Chapter_13_mysql.ini");
        Class.forName(crst.driver);


        // 获取离线RowSet
        String query_sql = "select * from student_table";
        CachedRowSet rs = crst.doQuery(query_sql);

        // 对离线的RowSet进行操作，将记录指针置到最后之后，再向前滚动
        rs.afterLast();
        while (rs.previous()){
            System.out.println("打印第" + rs.getRow() + "行记录：" + rs.getString(1) + "\t"
                    + rs.getString(2) + "\t"
                    + rs.getString(3));
            if (rs.getInt("student_id") == 2){
                rs.updateString("student_name", "猪八戒_by_CH13_offlineRowSet");
                rs.updateRow();     // 提交修改
            }
        }

        // 注意离线修改并不是同步影响数据库的，需要重新建立连接后，让数据库接受离线RowSet的修改才能真正影响
        // 重新获取数据库的连接
        Connection connection = DriverManager.getConnection(crst.url, crst.user, crst.pwd);
        connection.setAutoCommit(false);        // 将自动提交置为否，从而能保存事务语句一致性提交才能成功，否则成功提交一半，另一半提交不成功会很麻烦
        // 把对RowSet所作的修改同步到底层数据库
        rs.acceptChanges(connection);
    }
}
